/**
 * 等待指定元素出现
 * @param {string} keyword 元素的文本内容
 * @param {number} timeout 等待超时时间（毫秒），为-1时则无限等待
 * @param {string} mode 类型，默认为text，取值有 text/desc/id
 * @returns 如果元素出现返回 元素对象，否则返回 null
 */
exports.waitForElement = function (keyword,timeout,mode) {
    if (null == timeout){
        timeout = -1
    }
    if (null == mode){
        mode = 'text'
    }
    let func
    if (mode === 'text'){
        func = textContains
    }else if(mode == 'desc'){
        func = descContains
    }else {
        func = id
    }
    if (timeout === -1) {
        // 循环检查元素是否存在
        while (true) {
            // 查找指定文本的元素
            let element = func.call(null,keyword).findOnce()

            // 如果找到元素，返回
            if (element != null) {
                return element
            }
            // 等待一段时间后再次检查
            sleep(10); // 等待 10 毫秒
        }
    } else {
        // 记录开始时间
        let startTime = new Date().getTime();

        // 循环检查元素是否存在
        while (true) {
            // 查找指定文本的元素
            let element = func.call(null,keyword).findOnce()

            // 如果找到元素，返回
            if (element != null) {
                return element;
            }

            // 如果超时，返回 null
            if (new Date().getTime() - startTime > timeout) {
                return null;
            }

            // 等待一段时间后再次检查
            sleep(10); // 等待 10 毫秒
        }
    }
}

/**
 * 屏幕坐标点击法
 * @param element
 */
exports.click = function (element){
    if (element.clickable()){
        element.click()
    }else {
        let x = element.bounds().centerX()
        let y = element.bounds().centerY()
        click(x,y)
    }
}

/**
 * 屏幕坐标长按
 * @param element
 */
exports.longClick = function (element){
    if (element.clickable()){
        element.longClick()
    }else {
        let x = element.bounds().centerX()
        let y = element.bounds().centerY()
        longClick(x,y)
    }
}

/**
 * 屏幕坐标按住
 * @param element
 */
exports.press = function (element,duration){
    let x = element.bounds().centerX()
    let y = element.bounds().centerY()
    press(x,y,duration)
}

/**
 * 选中
 * @param element
 * @param func
 */
exports.check = function (element,func){
    let args=Array()
    for (var i = 2; i < arguments.length; i++) {
        args.push(arguments[i])
    }
    while (!element.checked()){
        this.click(element)
        element = func.apply(null,args)
    }
}

/**
 * 不选中
 * @param element
 * @param func
 */
exports.uncheck = function (element,func){
    let args=Array()
    for (var i = 2; i < arguments.length; i++) {
        args.push(arguments[i])
    }
    while (element.checked()){
        this.click(element)
        element = func.apply(null,args)
    }
}

/**
 * 吐司
 * @param message
 */
exports.toast = function (message){
    print(message)
    toast(message)
}
/**
 * 打印一个控件
 * @param element
 */
exports.print_detail = function (element){
    print("类名：" + element.className())
    print("包名：" + element.packageName())
    print("在屏幕范围：" + element.bounds())
    print("在父控件绘制顺序：" + element.drawingOrder())
    print("在父控件位置：" + element.indexInParent())
    print("控件是否可点击：" + element.clickable())
    print("控件是否可长按：" + element.longClickable())
    print("控件是否可勾选：" + element.checkable())
    print("控件是否可已勾选：" + element.checked())
    print("控件是否可滑动：" + element.scrollable())
    print("控件是否已选择：" + element.selected())
    print("控件是否可见：" + element.visibleToUser())
    print("控件是否已启用：" + element.enabled())
    print("控件的布局深度：" + element.depth())
    print("控件是否可编辑：" + element.editable)
    print("控件ID：" + element.id())
    print("控件文本：" + element.text())
    print("控件描述：" + element.desc())
}
